package licode.unisop.oidc.auth.stu;

import licode.unisop.oidc.auth.api.OidcSession;
import licode.unisop.oidc.auth.gateway.AuthorCache;
import licode.unisop.oidc.auth.gateway.AuthorDelegate;
import licode.unisop.oidc.auth.modal.*;

/**
 * 授权工具类
 *
 * @author licode
 */
public class AuthorUtil {
    private static AuthorDelegate authorDelegate;
    private static AuthorCache authorCache;

    public static void setLoginDelegate(AuthorDelegate authorDelegate) {
        AuthorUtil.authorDelegate = authorDelegate;
    }

    public static AuthorCache getCache() {
        return authorCache;
    }

    public static void setCache(AuthorCache authorCache) {
        AuthorUtil.authorCache = authorCache;
    }

    /**
     * 普通登录接口
     *
     * @param req 登录参数信息
     * @return 返回登录信息
     */
    public static OidcToken login(AuthorRequest req) {
        return authorDelegate.login(req);
    }

    /**
     * 单点登录生成主会话接口
     *
     * @param req 登录参数信息
     * @return 返回主会话Token
     */
    public static SsoToken buildMasterSession(AuthorRequest req) {
        return authorDelegate.buildMasterSession(req);
    }

    public static String loginIdFromAccessToken(AccessTokenId tokenId) {
        return authorDelegate.loginIdFromAccessToken(tokenId);
    }

    public static String loginIdFromRefreshToken(RefreshTokenId tokenId) {
        return authorDelegate.loginIdFromRefreshToken(tokenId);
    }

    /**
     * 单点登录接口
     *
     * @param req 登录参数信息
     * @return 返回登录信息
     */
    public static OidcToken loginSso(AuthorRequest req) {
        return authorDelegate.loginSso(req);
    }

    /**
     * 刷新访问信息
     * @param request 请求参数信息
     * @return 返回登录令牌信息
     */
    public static OidcToken refresh(RefreshTokenId request, boolean newToken) {
        return authorDelegate.refresh(request, newToken);
    }

    /**
     * 根据访问令牌获取登录信息
     *
     * @param accessToken 访问令牌
     * @return 登录信息
     */
    public static OidcToken getTokenInfo(AccessTokenId accessToken) {
        return authorDelegate.getTokenInfo(accessToken);
    }

    /**
     * 通过用户ID获取对应的会话信息
     * @param userId 用户ID
     * @return 会话信息
     */
    public static OidcSession getSession(UserInfoId userId) {
        return authorDelegate.getSession(userId);
    }

    /**
     * 通过访问令牌获取对应的会话信息
     * @param accessToken 访问令牌
     * @return 会话信息
     */
    public static OidcSession getSession(AccessTokenId accessToken) {
        return authorDelegate.getSession(accessToken);
    }

    /**
     * 通过单点登录令牌获取对应的会话信息
     * @param ssoToken 访问令牌
     * @return 会话信息
     */
    public static OidcSession getSession(SsoTokenId ssoToken) {
        return authorDelegate.getSession(ssoToken);
    }

    /**
     * 退出登录
     *
     * @param accessToken 访问令牌
     */
    public static void exitLogin(AccessTokenId accessToken) {
        authorDelegate.exitLogin(accessToken);
    }

    /**
     * 踢人下线
     *
     * @param accessToken 访问令牌
     */
    public static void kickLogin(AccessTokenId accessToken) {
        authorDelegate.kickLogin(accessToken);
    }

    /**
     * 踢掉指定用户所有登录
     *
     * @param userInfoId 用户ID
     */
    public static void kickLogin(UserInfoId userInfoId) {
        authorDelegate.kickLogin(userInfoId);
    }

    /**
     * 冻结登录
     *
     * @param accessToken 访问令牌
     */
    public static void freezeLogin(AccessTokenId accessToken) {
        authorDelegate.freezeLogin(accessToken);
    }

    /**
     * 解冻登录
     *
     * @param accessToken 访问令牌
     */
    public static void unfreezeLogin(AccessTokenId accessToken) {
        authorDelegate.unfreezeLogin(accessToken);
    }

    /**
     * 冻结整个用户登录
     *
     * @param userInfoId 用户ID
     */
    public static void freezeLogin(UserInfoId userInfoId) {
        authorDelegate.freezeLogin(userInfoId);
    }

    /**
     * 解冻整个用户登录
     *
     * @param userInfoId 用户ID
     */
    public static void unfreezeLogin(UserInfoId userInfoId) {
        authorDelegate.unfreezeLogin(userInfoId);
    }

    /**
     * 退出单独登录
     * @param accessToken 访问令牌
     */
    public static void exitSso(AccessTokenId accessToken) {
        authorDelegate.exitSso(accessToken);
    }

    /**
     * 退出会话，包括普通登录和单点登录
     * @param accessToken 访问令牌
     */
    public static void exitSession(AccessTokenId accessToken) {
        authorDelegate.exitSession(accessToken);
    }

    /**
     * 退出会话，包括普通登录和单点登录
     * @param loginId 登录标识
     */
    public static void exitSession(LoginId loginId) {
        authorDelegate.exitSession(loginId);
    }
}
